import pyb
import sensor, image, time, math
import os, tf
from machine import UART, Pin
from pyb import LED
import ustruct


uart = UART(2, baudrate=115200)     # 初始化串口 波特率设置为115200 TX是B12 RX是B13
#red = LED(1)   # 定义一个LED1   照明灯
#green = LED(2)  # 定义一个LED2   照明灯
#blue  = LED(3)   # 定义一个LED3   照明灯
white = LED(4)    # 定义一个LED4   照明灯

cards = ["a-cube",#正方体
"b-cuboid",       #长方体
"c-cylinder",     #圆柱
"d-polyhedron",   #多面体
"e-sphere"]       #球体

yellow = (0, 100, -128, 127, -128, 90)
grays_tt = (2, 47, -128, 108, -128, 104)

def recognition_picture():
    sensor.reset()
    sensor.set_pixformat(sensor.GRAYSCALE)
    sensor.set_framesize(sensor.QVGA) # we run out of memory if the resolution is much bigger...
    sensor.set_windowing((160, 160))  #取中间的160*160区域
    sensor.set_brightness(800)
    sensor.skip_frames(time = 2000)
    sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
    sensor.set_auto_whitebal(False)  # 白平衡
def outuart1(t):
    data1 = ustruct.pack("<bsbb",      #格式为俩个字符俩个短整型(2字节)#b为两字节 h为四字节
                   0xFB,
                   str(t),                     #帧头1
                   0x44,
                   0x55,
                   )
    uart.write(data1)

def GetDataQuery():                        #获得串口发送函数
    global uart_str
    uart_num = uart.any()
    if uart_num:
        uart_receive_str = uart.read(uart_num)

# 这个示例演示如何加载tflite模型并运行
# 这个示例演示如何加载tflite模型并运行
# 这个示例演示如何加载tflite模型并运行
#white.on()
net_path = "grayscale_null_successful.tflite"                                 # 定义形状分类模型的路径
labels = [line.rstrip() for line in open("/sd/labels.txt")]   # 加载标签
net = tf.load(net_path, load_to_fb=True)                      # 加载模型

clock = time.clock()
recognition_picture()
while(True):
    clock.tick()
    img = sensor.snapshot()
    #img = img.to_grayscale(rgb_channel=1) # 0表示从红色通道获取灰度图
    #yellow_blobs = img.find_blobs([yellow])
    #yellow_blobs = img.find_blobs([yellow],invert=1,merge=False)
    #for blob in yellow_blobs:
        #print("\n色块面积:", blob.area())
        #img.draw_rectangle(blob.rect(), color=(0,0,255))

    #for r in img.find_rects(threshold = 50000):             # 在图像中搜索矩形
        #img.draw_rectangle(r.rect(), color = (255, 0, 0))   # 绘制矩形外框，便于在IDE上查看识别到的矩形位置
        #img1 = img.copy(r.rect())                           # 拷贝矩形框内的图像

        # 将矩形框内的图像使用训练好的模型进行分类
        # net.classify()将在图像的roi上运行网络(如果没有指定roi，则在整个图像上运行)
        # 将为每个位置生成一个分类得分输出向量。
        # 在每个比例下，检测窗口都以x_overlap（0-1）和y_overlap（0-1）为指导在ROI中移动。
        # 如果将重叠设置为0.5，那么每个检测窗口将与前一个窗口重叠50%。
        # 请注意，重叠越多，计算工作量就越大。因为每搜索/滑动一次都会运行一下模型。
        # 最后，对于在网络沿x/y方向滑动后的多尺度匹配，检测窗口将由scale_mul（0-1）缩小到min_scale（0-1）。
        # 下降到min_scale(0-1)。例如，如果scale_mul为0.5，则检测窗口将缩小50%。
        # 请注意，如果x_overlap和y_overlap较小，则在较小的比例下可以搜索更多区域...

        # 默认设置只是进行一次检测...更改它们以搜索图像...
    for obj in tf.classify(net , img, min_scale=1.0, scale_mul=0.95, x_overlap=0.0, y_overlap=0.0):
        #print("**********\nTop 1 Detections at [x=%d,y=%d,w=%d,h=%d]" % obj.rect())
        sorted_list = sorted(zip(labels, obj.output()), key = lambda x: x[1], reverse = True)
        # 打印准确率最高的结果
        for i in range(1):
            if sorted_list[i][1] > 0.9:
                print("%s = %f" % (sorted_list[i][0], sorted_list[i][1]))
                uart.write(sorted_list[i][0])

    #print(clock.fps())
